//poj 2989
int g[maxn][maxn],f[maxn][maxn],vis[maxn][maxn];

/*********统计极大团的个数**********************/
int num=0;//统计极大团的个数
void numclique(int ng,int g[][maxn],int nv,int vis[][maxn],int dep)
{//g是表示极大团的可行数，vis是极大团已经统计过的，用来判重
	if(!ng)
	{
		if(!nv)
			num++;
		return;
	}
	int i,j,k,u,v;
	int tng=0,tnv=0;
	for(i=0; i<nv ;i++)//查找极大团是否是已经统计过
	{//vis是极大团已经统计过的,所以如果里面有可以成为极大团的点那么此方案不可行
		u=vis[dep][i];
		int flag=0;
		for(j=0; j<ng; j++)
		{
			v=g[dep][j];
			if(!f[u][v])
			{
				flag=1;break;
			}
		}
		if(!flag)return ;
	}
	
	for(i=0; i<ng ;i++)
	{
		u=g[dep][i];
		tng=0;
		for(j=i+1; j<ng; j++)
		{//查找下一可行解
			v=g[dep][j];
			if(f[u][v]) 
				g[dep+1][tng++]=v;
		}
		tnv=0;
		for(j=0; j<nv; j++)
		{//查找下一个的已被统计过的可行解
			v=vis[dep][j];
			if(f[u][v])
			{
				vis[dep+1][tnv++]=v;
			}			
		}
		if(num>1000)return;
		numclique(tng,g,tnv,vis,dep+1);
		vis[dep][nv++]=u;//跟新被统计过的点
	}
}
/*********统计极大团的个数**********************/
int main()
{
	int i,j,t,k;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		int x,y;
		memset(f,0,sizeof(f));
		for(i=0; i<m; i++)
		{
			scanf("%d%d",&x,&y);
			x--;y--;
			f[x][y]=f[y][x]=1;
		}
		num=0;
		for(i=0; i<n ;i++)
			g[0][i]=i;
		numclique(n,g,0,vis,0);
		if(num>1000)
			puts("Too many maximal sets of friends.");
		else
			printf("%d\n",num);
		
	}
}
